#include <mod/include/IO_EXPENDER_TWI.h>

/***********************************************************************************************************************
*
*        IO_EXPENDER maakt gebruik van I2C.
*
*        Versie 0.1  04/06/2010
*        Opstellen IO_EXPENDER programma.
*
***********************************************************************************************************************/


void IO_EXPENDER_0_Init(void)
{
   unsigned long int loop;
   
   TWI_Start(0x20,0);
   TWI_Write(0x00);
   TWI_Write(0x00);
   TWI_Write(0xFF);
   TWI_Stop();
   loop=240;
   while(loop--);



/*  TWI_Start(0x20,0);             //Slave select I/O expender 1 met RW=0.
  TWI_Write(0x00);               //IODIRA register aanroepen. (LET op! dit is register select niet device select!)
  TWI_Write(0xF0);               //Alle poorten staan aangegeven als output.
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld.
 
  TWI_Start(0x20,0);             //Slave select I/O expender 1 met RW=0.
  TWI_Write(0x01);               //IODIRB register aanroepen.
  TWI_Write(0xFF);               //Alle poorten staan aangegeven als input.                                     //tijdelijk output
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld.
  
  TWI_Start(0x20,0);             //Slave select I/O expender 1 met RW=0.
  TWI_Write(0x02);               //IPOLA register aanroepen.
  TWI_Write(0x00);               //GPIO register bit will reflect the same logic state of the input pin.   
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.

  TWI_Start(0x20,0);             //Slave select I/O expender 1 met RW=0.
  TWI_Write(0x03);               //IPOLB register aanroepen.  
  TWI_Write(0x00);               //GPIO register bit will reflect the same logic state of the input pin.
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld.
  
  TWI_Start(0x20,0);             //Slave select I/O expender 1 met RW=0.
  TWI_Write(0x04);               //GPINTENA register aanroepen.  
  TWI_Write(0x00);               //Disable GPIO input pin for interrupt-on-change event. 
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld.

  TWI_Start(0x20,0);             //Slave select I/O expender 1 met RW=0.
  TWI_Write(0x05);               //GPINTENB register aanroepen.      
  TWI_Write(0x00);               //Disable GPIO input pin for interrupt-on-change event.
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld.*/

  //IOCON Register hoeft niet te worden aangepast (Unimplemented bit, read as ?0?).
  //GPPU Register Pull-up disabled (Unimplemented bit, read as ?0?).
  //INTF Register --> Interrupt FLAG register Read, niet gebruikt.
  //INTERRUPT CAPTURED VALUE FOR PORT REGISTER --> niet gebruikt.
  
  //TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.
}

void IO_EXPENDER_1_Init(void)
{ 
   unsigned long int loop;
   TWI_Start(0x27,0);             //Slave select I/O expender 1 met RW=0 en E voor divice select.
   TWI_Write(0x00);               //IODIRA register aanroepen. (LET op! dit is register select niet device select!)
   TWI_Write(0x0F);               //Alle poorten staan aangegeven als output.
   TWI_Write(0xFF);               //Alle poorten staan aangegeven als output.
   TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.
   loop=240;
   while(loop--);
   TWI_Start(0x27,0);             //Slave select I/O expender 1 met RW=0 en E voor divice select.
   TWI_Write(0x0C);               //IODIRA register aanroepen. (LET op! dit is register select niet device select!)
   TWI_Write(0xFF);               //Alle poorten staan aangegeven als output.
   TWI_Write(0x00);               //Alle poorten staan aangegeven als output.
   TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.
   loop=240;
   while(loop--);

/*  TWI_Start(0x27,0);             //Slave select I/O expender 1 met RW=0 en E voor divice select.
  TWI_Write(0x01);               //IODIRB register aanroepen.
  TWI_Write(0xFF);               //Alle poorten staan aangegeven als input.  
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.
  
  TWI_Start(0x27,0);             //Slave select I/O expender 1 met RW=0 en E voor divice select.
  TWI_Write(0x02);               //IPOLA register aanroepen.
  TWI_Write(0x00);               //GPIO register bit will reflect the same logic state of the input pin.   
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.

  TWI_Start(0x27,0);             //Slave select I/O expender 1 met RW=0 en E voor divice select.
  TWI_Write(0x03);               //IPOLB register aanroepen.  
  TWI_Write(0x00);               //GPIO register bit will reflect the same logic state of the input pin.
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.
  
  TWI_Start(0x27,0);             //Slave select I/O expender 1 met RW=0 en E voor divice select.
  TWI_Write(0x04);               //GPINTENA register aanroepen.  
  TWI_Write(0x00);               //Disable GPIO input pin for interrupt-on-change event. 
  TWI_Stop();                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.
  
  TWI_Start(0x27,0);             //Slave select I/O expender 1 met RW=0 en E voor divice select.
  TWI_Write(0x05);               //GPINTENB register aanroepen.      
  TWI_Write(0x00);               //Disable GPIO input pin for interrupt-on-change event.
  TWI_Stop();*/                    //Stop de verbinding, I/O Expender is ingesteld is ingesteld.
}


void IO_EXPENDER_0_Write(unsigned int IOData0)
{
   unsigned long int loop;
   TWI_Start(0x20,0);   
   TWI_Write(0x14);               //GPIOA register aanroepen (A poort vanwege output).                   //tijdelijk als PORTB output
   TWI_Write(IOData0);            //Data wegschrijven.
   TWI_Stop();

   loop=240;
   while(loop--);

}

void IO_EXPENDER_1_Write(unsigned int IOData1)
{
   unsigned long int loop;
   TWI_Start(0x27,0);   
   TWI_Write(0x14);               //GPIOA register aanroepen (A poort vanwege output).
   TWI_Write(IOData1);            //Data wegschrijven.
   TWI_Stop();
   loop=240;
   while(loop--);
}

void IO_EXPENDER_1_Direction(unsigned int dir)
{
   unsigned long int loop;
   TWI_Start(0x27,0);   
   TWI_Write(0x00);               //GPIOA register aanroepen (A poort vanwege output).
   TWI_Write(dir);            //Data wegschrijven.
   TWI_Stop();
   loop=240;
   while(loop--);
}

int IO_EXPENDER_0_Read(void)
{
   unsigned char IORead0,adress=0x13;
   TWI_Start1(0x20,1,&adress,1);               //RW=0
   TWI_Stop();
   IORead0 = TWI_Read();
   return(IORead0);
}

int IO_EXPENDER_1_Read(void)  //Keyboard.                        
{
   unsigned char IORead1,adress=0x12;
   TWI_Start1(0x27,1,&adress,1);               //RW=0
   TWI_Stop();
   IORead1 = TWI_Read();
   return(IORead1);
}

int IO_EXPENDER_Read(unsigned char adress)  //Keyboard.                        
{
  unsigned char IORead1;
  TWI_Start1(0x27,1,&adress,1);               //RW=0
  TWI_Stop();
  IORead1 = TWI_Read();
  return(IORead1);  
}
